#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <chrono>
#include <thread>

using namespace std;


int main() {
    // 创建多个子进程
    for (int i = 0; i < 3; ++i) {
        pid_t pid = fork();
        if (pid == 0) {
            // 子进程
            cout << "Child " << i << " (PID: " << getpid() << ") running..." << endl;
            sleep(2 + i); // 每个子进程休眠不同时间
            cout << "Child " << i << " (PID: " << getpid() << ") exiting..." << endl;
            exit(i); // 子进程以其序号为退出码
        }
    }

    // 父进程：非阻塞轮询等待所有子进程完成
    int status;
    int completed = 0; // 已完成的子进程计数
    while (completed < 3) {
        pid_t ret = waitpid(-1, &status, WNOHANG); // 非阻塞检查子进程状态
        if (ret > 0) {
            // 有子进程状态变化
            completed++;
            if (WIFEXITED(status)) {
                cout << "Child process " << ret << " exited with code: " << WEXITSTATUS(status) << endl;
            } else if (WIFSIGNALED(status)) {
                cout << "Child process " << ret << " was terminated by signal: " << WTERMSIG(status) << endl;
            }
        } else if (ret == 0) {
            // 没有子进程状态变化，父进程继续其他工作
            cout << "No child process exited yet. Parent doing other work..." << endl;
            this_thread::sleep_for(chrono::seconds(1)); // 模拟其他任务
        } else {
            // 错误处理
            perror("waitpid failed");
            break;
        }
    }

    cout << "All child processes have finished." << endl;
    return 0;
}

//
//int main() {
//    // 创建多个子进程
//    for (int i = 0; i < 3; ++i) {
//        pid_t pid = fork();
//        if (pid == 0) {
//            // 子进程
//            cout << "Child " << i << " (PID: " << getpid() << ") running..." << endl;
//            sleep(2 + i); // 每个子进程休眠不同时间
//            cout << "Child " << i << " (PID: " << getpid() << ") exiting..." << endl;
//            exit(i); // 子进程以其序号为退出码
//        }
//    }
//
//    // 父进程：等待所有子进程完成
//    int status;
//    while (true) {
//        pid_t ret = wait(&status); // 阻塞等待任意一个子进程结束
//        if (ret == -1) {
//            // 没有子进程可等待时退出循环
//            cout << "All child processes have finished." << endl;
//            break;
//        }
//        // 解析子进程状态
//        if (WIFEXITED(status)) {
//            cout << "Child process " << ret << " exited with code: " << WEXITSTATUS(status) << endl;
//        } else if (WIFSIGNALED(status)) {
//            cout << "Child process " << ret << " was terminated by signal: " << WTERMSIG(status) << endl;
//        }
//    }
//
//    return 0;
//}






//int main() {
//    pid_t pid = fork(); // 创建子进程
//
//    if (pid == 0) {
//        // 子进程逻辑
//        cout << "Child process running..." << endl;
//        sleep(5); // 模拟子进程任务，延迟 5 秒
//        cout << "Child process exiting..." << endl;
//        exit(42); // 子进程以退出码 42 正常退出
//    } else if (pid > 0) {
//        // 父进程逻辑
//        int status;
//        while (true) {
//            pid_t ret = waitpid(-1, &status, WNOHANG); // 非阻塞检查子进程状态
//            if (ret == 0) {
//                // 子进程尚未终止，父进程继续其他工作
//                cout << "Child process still running. Parent doing other work..." << endl;
//                this_thread::sleep_for(chrono::seconds(1)); // 模拟父进程任务
//            } else if (ret > 0) {
//                // 子进程已终止，解析状态
//                if (WIFEXITED(status)) {
//                    cout << "Child process " << ret << " exited with code " << WEXITSTATUS(status) << endl;
//                } else if (WIFSIGNALED(status)) {
//                    cout << "Child process " << ret << " was terminated by signal " << WTERMSIG(status) << endl;
//                }
//                break; // 结束轮询
//            } else {
//                // waitpid 出错
//                perror("waitpid failed");
//                break;
//            }
//        }
//    } else {
//        // fork 失败
//        perror("fork failed");
//        return 1;
//    }
//
//    return 0;
//}


//void  childtast()
//{
//    for(int i = 0; i< 10;i++)
//    {
//        cout << i << endl;
//    }
//    sleep(3);
//}


//int main()
//{
//    pid_t id = fork();
//    
//    cout << "id" << ":" << id <<endl;
//    if(id == 0)
//    {
//        sleep(8);
////        childtast();
//        exit(1);   
//    }
//    int status;
//    pid_t ret = waitpid(-1,&status,0);
//    if(ret == id)
//    {
//        cout << "ret" << ":" << ret <<endl;
//        cout<< "wait success" <<endl;
//    }
//
//    cout <<"status :" << status << endl;
//    cout << "退出码" << ((status >> 8)& 0xff ) <<" "<< "信号码" << (status & 0x7f)<< endl;
//    return 0; 
//
//
//
//    if(id > 0)
//    {
//        while(1){
//
//        cout << "父进程"<< "pid :"<<getpid() <<endl;
//
//        sleep(2);
//        }
//        
//    }
//    else if(id == 0)
//    {
//        while(1)
//        {
//    
//        cout << "子进程"<< "pid :"<<getpid() <<endl;
//
//        sleep(2);
//        }
//    }
//    else 
//    {
//        perror("fork");
//    }
    
    
    //return 0;
//}



    
